package jp.co.nikkeibp.android.BombGame;

import java.util.Random;
import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.SystemClock;
import android.os.Vibrator;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.TableLayout;
import android.widget.TableRow;

public class BombGameActivity extends Activity {
	private int row = 9;//セルの行数
	private int col = 9;//セルの列数
	private int bombNum = 5;//爆弾の個数
	private int [] bombPos;//爆弾の位置を入れる配列
	private final int MENU01 = 0;
	private final int MENU02 = 1;
	private Chronometer chronometer;
	private int openCount = 0;

	/**
	 * Activity(画面)を表示するときに一番初めに呼び出されます。
	 */
    @Override
    public void onCreate(Bundle savedInstanceState) {	//・・・①
    	getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//ステータスバーを消去
    	requestWindowFeature(Window.FEATURE_NO_TITLE);//タイトルバーを消去
        super.onCreate(savedInstanceState);
        init();
        setBomb(bombNum);
        TableLayout tableLayout = getTableLayout();
        setContentView(tableLayout);
    }
    /**
     * 初期処理を実装します。
     */
	private void init() {								//・・・②
		SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
		row  = pref.getInt("H", 9);
		col = pref.getInt("W", 9);
		bombNum = pref.getInt("bombNum", 5);
		//クロノメータ取得(ここでbaseの時刻がセットされる)
		chronometer = new Chronometer(this);
	}

	/**
     * 爆弾の位置をランダムで決定しフィールドにセットします。
     * @param bombNum
     */
    private void setBomb(int bombNum) {					//・・・③
    	int totalCellNum = row * col;//全体のセルの数
    	bombPos = new int[totalCellNum];//配列の初期化
		Random random = new Random();
    	for (int i = 0; i < bombNum; i++) {
    		int pos = random.nextInt(totalCellNum);
        	Log.d("--AS--", ""+pos);
    		//まだ1がセットされていなければ
    		if (bombPos[pos] != 1) {
        		bombPos[pos] = 1;//爆弾の位置に1をセットする
    		} else {
    			i--;
    		}
    	}
	}
	/**
     * 升目を示すテーブルレイアウトを返却します。
     * @return TableLayout
     */
    private TableLayout getTableLayout() {				//・・・④
    	int totalCellNum = row * col;//全体のセルの数
        TableLayout tableLayout = new TableLayout(this);
        TableRow tableRow = null;
        for (int i = 0; i < totalCellNum; i++) {
        	if (i % col == 0) {
        		tableRow = new TableRow(this);
        		tableLayout.addView(tableRow);
        	}
        	Button button = new Button(this);
        	button.setId(i);
        	button.setHeight(getCellHeight(row));
        	button.setWidth(getCellWidth(col));
        	button.setGravity(Gravity.CENTER);
        	button.setBackgroundDrawable(getResources().getDrawable(R.drawable.offtile));
        	setEvent(button);//イベントをセットする
        	tableRow.addView(button);
        }
        return tableLayout;
    }
    /**
     * 各テキストビューにイベントをセットします。
     * @param button
     */
    private void setEvent(Button button) {				//・・・⑤
    	//タップ時の動作
    	button.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Button button = (Button)v;
				int pos = button.getId();//ボタンのID＝場所
				//Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
				if (bombPos[pos] == 1) {
					button.setBackgroundDrawable(getResources().getDrawable(R.drawable.bombtile));
					gameOverDialog();//ゲームオーバーのダイアログを表示する
					//vibrator.vibrate(300);//ms
				} else {
					//vibrator.vibrate(50);//ms
					int nearBombNum = 0;//近接している爆弾の数を示す
					for (int i = 0; i < bombPos.length; i++) {
						if (bombPos[i] == 1) {
							//最左列の場合
							Log.d("LOG", ""+((i+1) % col));
							if ((i+1) % col == 1) {
								//爆弾に隣接する8箇所を設定
								if ((i + 1 == pos) ||
									(i + col == pos) || (i + col + 1 == pos) ||
									(i - col == pos) || (i - col + 1 == pos) ) {
									nearBombNum++ ;
								}
							//最右列の場合
							} else if ((i+1) % col == 0) {
								//爆弾に隣接する8箇所を設定
								if ((i - 1 == pos) ||
									(i + col == pos) || (i + col - 1 == pos) ||
									(i - col == pos) || (i - col - 1 == pos)) {
									nearBombNum++ ;
								}
							} else {
								//爆弾に隣接する8箇所を設定
								if ((i + 1 == pos) || (i - 1 == pos) ||
									(i + col == pos) || (i + col + 1 == pos) || (i + col - 1 == pos) ||
									(i - col == pos) || (i - col + 1 == pos) || (i - col - 1 == pos)) {
									nearBombNum++ ;
								}
							}
						}
					}
					//隣接する爆弾の数に合わせて背景をセット
					switch(nearBombNum) {
					case 0:
						button.setBackgroundDrawable(getResources().getDrawable(R.drawable.ontitle));
						break;
					case 1:
						button.setBackgroundDrawable(getResources().getDrawable(R.drawable.on1title));
						break;
					case 2:
						button.setBackgroundDrawable(getResources().getDrawable(R.drawable.on2title));
						break;
					case 3:
						button.setBackgroundDrawable(getResources().getDrawable(R.drawable.on3title));
						break;
					case 4:
						button.setBackgroundDrawable(getResources().getDrawable(R.drawable.on4title));
						break;
					case 5:
						button.setBackgroundDrawable(getResources().getDrawable(R.drawable.on5title));
						break;
					case 6:
						button.setBackgroundDrawable(getResources().getDrawable(R.drawable.on6title));
						break;
					case 7:
						button.setBackgroundDrawable(getResources().getDrawable(R.drawable.on7title));
						break;
					case 8:
						button.setBackgroundDrawable(getResources().getDrawable(R.drawable.on8title));
						break;
					}
				}
				//ボタンをクリックしたらカウントアップ
				if (button.isClickable() != false) {
					openCount++;
				}
				button.setClickable(false);//クリックをできないようにする
				//爆弾を除いて全部空けたらクリアー
				if (openCount == (row * col - bombNum)) {
					congratulationsDialog();
				}
				Log.d("--AS--", ""+openCount);
			}
		});
    	//長押し時の動作
    	button.setOnLongClickListener(new View.OnLongClickListener() {
			public boolean onLongClick(View v) {
				Button button = (Button)v;
				if(button.isClickable()) {//まだ押していない場合は
					button.setBackgroundDrawable(getResources().getDrawable(R.drawable.flagtile));
				}
				return true;
			}
		});
	}
	/**
     * 行数と画面の幅からセルの高さを算出します。
     * @param row
     * @return セルの高さ
     */
    private int getCellHeight(int row) {					//・・・⑥
    	WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        return display.getHeight() / row;
    }
    /**
     * 列数と画面の幅からセルの幅を算出します。
     * @param col
     * @return
     */
    private int getCellWidth(int col) {						//・・・⑦
    	WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        return display.getWidth() / col;
    }
    /**
     * メニューを生成します。
     */
    @Override
	public boolean onCreateOptionsMenu(Menu menu) {			//・・・⑧
        menu.add(Menu.NONE, MENU01, Menu.NONE, "盤面の変更");
        menu.add(Menu.NONE, MENU02, Menu.NONE, "リセット");
		return true;
	}
    /**
     * メニューが選択されたときに呼び出されます。
     */
	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {	//・・・⑨
		switch (item.getItemId()) {
		case MENU01://盤面の変更
			Intent intent = new Intent(this, SettingsActivity.class);
			startActivity(intent);
			break;
		case MENU02://リセット
			reset();
			break;
		}
		return true;
	}
	/**
	 * Layoutをリセットします。
	 */
	private void reset() {									//・・・⑩
		init();
        setBomb(bombNum);
        TableLayout tableLayout = getTableLayout();
        setContentView(tableLayout);
	}
	/**
	 * ゲームオーバー時にダイアログボックスを表示します。
	 */
	private void gameOverDialog() {							//・・・⑪
        int seconds = (int)(SystemClock.elapsedRealtime() - chronometer.getBase())/1000;
        String secStr = String.format("%02d", seconds/60) +":"+ String.format("%02d", seconds % 60);//分：秒形式に
        Builder builder = new Builder(this);
        builder.setTitle("ゲームオーバー");
        builder.setMessage("経過時間：" + secStr);
        builder.show();
        openCount = 0;
	}
	/**
	 * ゲームクリアー時のダイアログボックスを表示します。
	 */
	private void congratulationsDialog() {					//・・・⑫
        int seconds = (int)(SystemClock.elapsedRealtime() - chronometer.getBase())/1000;
        String secStr = String.format("%02d", seconds/60) +":"+ String.format("%02d", seconds % 60);//分：秒形式に
        Builder builder = new Builder(this);
        builder.setTitle("おめでとうございます！！");
        builder.setMessage("経過時間：" + secStr);
        builder.show();
        openCount = 0;
	}


}